﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Aeroporto.modelo;
using System.Data;
using Npgsql;
using System.Collections;

namespace Aeroporto.bd
{
    abstract class GenericDAO
    {
        /**
         * Exclui um registro passando o sql
         **/
        public MyMessageBox excluir(string sql)
        {         
            MyMessageBox mb = new MyMessageBox("","");
            try
            {
                Arquivo.escrever(sql);
                if (Conexao.consulta(sql).RecordsAffected > 0)
                {
                    mb.String1 = "Removido com sucesso!";
                    mb.String2 = "Removido.:";
                }
                else
                {
                    mb.String1 = "Erro ao remover";
                    mb.String2 = "Erro não foi removido.:";
                }
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
                mb.String1 = "Erro ao remover";
                mb.String2 = "Erro não foi removido.:";
            }
            return mb;
        }

        /**
         * Exclui um registro passando a tabela, a coluna e o valor do registo a ser excluído
         **/
        public MyMessageBox excluir(string tabela, string coluna, ArrayList valores)
        {
            MyMessageBox mb = new MyMessageBox("Removido com sucesso", "OK");
            for (int i = 0; i < valores.Count; i++)
            {
                mb = excluir("delete from " + tabela + " where " + coluna + "= '" + valores[i] +"'");
                if (mb.String2 == "Erro não foi removido.:")
                {
                    return mb;
                }
            }
            return mb;
        }

        public MyMessageBox excluir_assento(string tabela,string fila,int numero,string cod_aeronave)
        {
            MyMessageBox mb = new MyMessageBox("","");

            mb = excluir("delete from "+tabela+" where fila ='"+fila+"' and numero ="+numero+" and cod_aeronave ='"+cod_aeronave+"'" );
            if(mb.String2 == "Erro não foi removido.:")
            {
                return mb;
            }
            return mb;
        }
        

        /**
         * Busca no banco de dados os valores a serem listados no grid
         **/
        public DataTable lista_dados(String tabela)
        {
            try
            {
                string sql = "select * from " + tabela;
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();                
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;                
            }
        }

        public DataTable lista_dados(String tabela,String campo,String valor)
        {
            try
            {
                string sql = "select * from " + tabela + " where "+campo+" = '"+valor+"'";
                Arquivo.escrever(sql);
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }
        /**
         *  Retorna true se já existe um registro na tabela passada por parâmentro                    
         **/
        public bool existe_registro(string tabela, string coluna, string valor)
        {
            string sql = "select * from " + tabela + " where " + coluna + " = '" + valor+"'";
            NpgsqlDataReader datareader = Conexao.consulta(sql);
            bool hasrows = datareader.HasRows;
            datareader.Close();
            return hasrows;
        }

        public bool existe_assento(string tabela, string coluna1,string coluna2,string coluna3, string fila,int numero,string cod_aeronave)
        {
            string sql = "select * from " + tabela + " where " + coluna1 + " = '" + fila + "' and "+coluna2+" = "+numero+" and "+coluna3+"= '"+cod_aeronave+"'";
            NpgsqlDataReader datareader = Conexao.consulta(sql);
            bool hasrows = datareader.HasRows;
            datareader.Close();
            return hasrows;
        }

        /**
         * Persiste no banco de dados o objeto passado por parâmetro, se ocorreu tudo certo, retrona true
         **/
        public bool gravar_dados(modelo.IGenericModel generic_model)
        {
            try
            {                
                Conexao.consulta(generic_model.toGravarSQL());
                return true;
            }
            catch (Exception erro)
            {
                Arquivo.escrever(erro.ToString());
            }
            return false;
        }

        /**
         * Realiza busca no banco de dados por tabela, coluna e nome
         **/
        public DataTable pesquisar(string tabela, string coluna, string nome)
        {
            try
            {
                string sql = "select * from "+ tabela + " where upper(" + coluna + ") like '%" + nome.ToUpper() + "%'";
                Arquivo.escrever(sql);
                NpgsqlCommand command = new NpgsqlCommand(sql, Conexao.getConexao());
                NpgsqlDataAdapter da = new NpgsqlDataAdapter();
                da.SelectCommand = command;
                DataTable dt = new DataTable();
                da.Fill(dt);
                return dt;
            }
            catch (Exception erro)
            {
                throw erro;
            }
        }

    }
}
